package controller;

import java.util.ArrayList;
import java.util.Collection;

import model.Computador;
import model.Hardware;
import model.Periferico;
import model.Situacao;
import model.Software;
import dao.ComputadorDAO;
import dao.HardwareDAO;
import dao.PerifericoDAO;
import dao.SoftwareDAO;

public class ComputadorController {

	private ComputadorDAO computadorDAO;
	private HardwareDAO hardwareDAO;
	private SoftwareDAO softwareDAO;
	private PerifericoDAO perifericoDAO;

	public boolean inserirComputador(String descricao, String enderecoMac, String enderecoIp, 
			int idSistemaOperacional, Collection<String> descricaoHardwares,
			Collection<String> descricaoSoftwares, Collection<String> descricaoPerifericos) throws Exception {

		Software sistemaOperacional = getSoftwareDAO().buscarSoftwarePorId(idSistemaOperacional);
		Collection<Hardware> hardwares = new ArrayList<Hardware>();
		for (String string : descricaoHardwares) {
			hardwares.add(getHardwareDAO().buscarHardwarePorDescricao(string));
		}
		Collection<Software> softwares = new ArrayList<Software>();
		for (String string : descricaoSoftwares) {
			softwares.add(getSoftwareDAO().buscarSoftwarePorDescricao(string));
		}
		Collection<Periferico> perifericos = new ArrayList<Periferico>();
		for (String string : descricaoPerifericos) {
			perifericos.add(getPerifericoDAO().buscarPerifericoPorDescricao(string));
		}
		Computador computador = new Computador(0, descricao, enderecoMac,
				enderecoIp, sistemaOperacional, softwares, hardwares, perifericos, Situacao.DISPONIVEL);

		return getComputadorDAO().inserir(computador);
	}

	public boolean alterarComputador(int id, String descricao,
			String enderecoMac, String enderecoIp, int idSistemaOperacional,
			Collection<String> descricaoHardwares, Collection<String> descricaoSoftwares,
			Collection<String> descricaoPerifericos) throws Exception {

		Computador computador = getComputadorDAO().buscarComputadorPorId(id);
		Software sistemaOperacional = getSoftwareDAO().buscarSoftwarePorId(idSistemaOperacional);
		Collection<Hardware> hardwares = new ArrayList<Hardware>();
		for (String string : descricaoHardwares) {
			hardwares.add(getHardwareDAO().buscarHardwarePorDescricao(string));
		}
		Collection<Software> softwares = new ArrayList<Software>();
		for (String string : descricaoSoftwares) {
			softwares.add(getSoftwareDAO().buscarSoftwarePorDescricao(string));
		}
		Collection<Periferico> perifericos = new ArrayList<Periferico>();
		for (String string : descricaoPerifericos) {
			perifericos.add(getPerifericoDAO().buscarPerifericoPorDescricao(string));
		}

		computador.setDescricao(descricao);
		computador.setEnderecoMac(enderecoMac);
		computador.setEnderecoIp(enderecoIp);
		computador.setSistemaOperacional(sistemaOperacional);
		computador.setHardwares(hardwares);
		computador.setSoftwares(softwares);
		computador.setPerifericos(perifericos);

		return getComputadorDAO().alterar(computador);
	}

	public boolean excluirComputador(int id) throws Exception {
		Computador computador = getComputadorDAO().buscarComputadorPorId(id);
		return getComputadorDAO().delete(computador);
	}

	public Computador buscarComputadorPorId(int id) throws Exception {
		return getComputadorDAO().buscarComputadorPorId(id);
	}

	public Collection<Computador> buscarComputadores() throws Exception {
		return getComputadorDAO().buscarComputadores();
	}

	public ComputadorDAO getComputadorDAO() {
		if (computadorDAO == null) {
			computadorDAO = new ComputadorDAO();
		}
		return computadorDAO;
	}
	public HardwareDAO getHardwareDAO() {
		if (hardwareDAO == null) {
			hardwareDAO = new HardwareDAO();
		}
		return hardwareDAO;
	}
	public SoftwareDAO getSoftwareDAO() {
		if (softwareDAO == null) {
			softwareDAO = new SoftwareDAO();
		}
		return softwareDAO;
	}
	public PerifericoDAO getPerifericoDAO() {
		if (perifericoDAO == null) {
			perifericoDAO = new PerifericoDAO();
		}
		return perifericoDAO;
	}
}